# 
# 目标文件：test
# 依赖文件：a.o b.o
# 目标文件：a.o
# 依赖文件：a.c
# 目标文件：b.o
# 依赖文件：b.c
# $<：当前目标的第一个依赖
# $@：当前的目标文件
# 当执行make命令，会先进行test目标生成，当找寻后面依赖时，没有
# 		则会在下面进行依赖的生成
# 优点：当有一个文件修改时，只会对该文件进行编译汇编，对其他文件则不进行；
# 	 	不需要多次添加对应依赖生成的命令，兼容性提高；
# 	 	当a.h头文件修改时，可以进行更改
# 缺点：
# 

objs := a.o b.o

test:$(objs)
	gcc -o test $^

# .a.o.d .b.o.d
# 对于objs变量的每一个（foreach）成员f，修改成这样的.$(f).d格式
dep_files := $(foreach f,$(objs),.$(f).d)

# 筛选取出当前目录下已经存在的值为dep_files的文件
dep_files := $(wildcard $(dep_files))

# 如果dep_files变量不是空的话，则把生成的.$(f).d格式的文件包含进来
ifneq ($(dep_files),)
  include $(dep_files)
endif

# -Wp,-MD,.$@.d 用来生成依赖文件
%.o : %.c 
	gcc -Wp,-MD,.$@.d -c -o $@ $<

# 删除当前目录下所有的.o文件，test文件
clean:
	rm *.o test